/*********************************************************************************
  *FileName:  nsuc16xx_linuart.c
  *Version:   V1.0
  *Date:      2023-09-22
****************************************Includes***********************************/
#include "nsuc16xx_linuart.h"

/***************************************Variables***********************************/

/***************************************Functions***********************************/
void LINUART_Init(LINUART_TypeDef *LINUARTx, LINUART_InitTypeDef *LINUART_InitStruct)
{
    if (LINUART_InitStruct->LINUART_TXRX != DISABLE)
    {
        LINUARTx->CR_b.TXRXE = 1;
    }
    else
    {
        LINUARTx->CR_b.TXRXE = 0;
    }

    if (LINUART_InitStruct->LINUART_TXFifo != DISABLE)
    {
        LINUARTx->CR_b.TXFE = 1;
    }
    else
    {
        LINUARTx->CR_b.TXFE = 0;
    }

    if (LINUART_InitStruct->LINUART_RXFifo != DISABLE)
    {
        LINUARTx->CR_b.RXFE = 1;
    }
    else
    {
        LINUARTx->CR_b.RXFE = 0;
    }

    LINUARTx->CR_b.STOP = LINUART_InitStruct->LINUART_StopBits;

    if (LINUART_InitStruct->LINUART_Parity == LINUART_Parity_No)
    {
        LINUARTx->CR_b.PCE = 0;
    }
    else if (LINUART_InitStruct->LINUART_Parity == LINUART_Parity_Even)
    {
        LINUARTx->CR_b.PCE = 1;
        LINUARTx->CR_b.PS = 0;
    }
    else if (LINUART_InitStruct->LINUART_Parity == LINUART_Parity_Odd)
    {
        LINUARTx->CR_b.PCE = 1;
        LINUARTx->CR_b.PS = 1;
    }
    else
    {
    }

    LINUARTx->BRR = LINUART_InitStruct->LINUART_BaudRate;

    if (LINUART_InitStruct->LINUART_AutoBaudRate != DISABLE)
    {
        LINUARTx->CR_b.AUTOBRR = 1;
    }
    else
    {
        LINUARTx->CR_b.AUTOBRR = 0;
    }

    if (LINUART_InitStruct->LINUART_Mode == LINUART_Mode_LIN)
    {
        LINUARTx->CR_b.LINMODE = 1;
        LINUARTx->CR_b.BRRWINE = 1;     /* LIN 模式用户需要强制配置成1 */
        LINUARTx->CR_b.TXLOOPE = 1;     /* LIN 模式用户需要强制配置成1 */
    }
    else
    {
        LINUARTx->CR_b.LINMODE = 0;
        LINUARTx->CR_b.BRRWINE = 0;     
        LINUARTx->CR_b.TXLOOPE = 0;    

    }
    
    LINUARTx->CR_b.TXFCOMP = LINUART_InitStruct->LINUART_TXFifoBits;
    LINUARTx->CR_b.RXFCOMP = LINUART_InitStruct->LINUART_RXFifoBits;
}

void LINUART_Cmd(LINUART_TypeDef *LINUARTx, FunctionalState NewState)
{
    if (NewState != DISABLE)
    {
        LINUARTx->CR_b.UE = 1;
    }
    else
    {
        LINUARTx->CR_b.UE = 0;
    }
}


void LINUART_ITConfig(LINUART_TypeDef *LINUARTx, uint32_t LINUART_IT, FunctionalState NewState)
{
    if (NewState != DISABLE)
    {
        LINUARTx->IEN |= LINUART_IT;
    }
    else
    {
        LINUARTx->IEN &= (~(uint32_t)LINUART_IT);
    }
}

ITStatus LINUART_GetITStatus(LINUART_TypeDef *LINUARTx, uint32_t LINUART_ISR)
{
    ITStatus bitstatus = RESET;

    if ((LINUARTx->ISR & LINUART_ISR) != (uint32_t)RESET)
    {
        bitstatus = SET;
    }
    else
    {
        bitstatus = RESET;
    }
    return bitstatus;
}

void LINUART_ClearITPendingBit(LINUART_TypeDef *LINUARTx, uint32_t LINUART_ISR)
{
    LINUARTx->ISR |= LINUART_ISR;
}

uint16_t LINUART_ReceiveData(LINUART_TypeDef *LINUARTx)
{
    return (uint16_t)(LINUART->RDATA & (uint16_t)0x01FF);
}

void LINUART_SendData(LINUART_TypeDef *LINUARTx, uint16_t Data)
{
    LINUART->TDATA = (Data & (uint16_t)0x01FF);
}

void LINUART_TXFIFO_Fill(LINUART_TypeDef *LINUARTx, uint8_t *data, uint8_t len)
{
    for (uint32_t i = 0; i < len; i++)
    {
        LINUART->TXFIFO = data[i];
    }
}

void LINUART_SetRXFIFO(LINUART_TypeDef *LINUARTx, uint8_t len)
{
		LINUARTx->CR_b.RXFCOMP = len;
}

/***************************************END OF FILE*********************************/
